from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render, get_object_or_404 
from django.core.mail import send_mail
from .models import Post
from .forms import EmailPostForm, CommentForm
from django.db.models import Count 
from django.contrib.postgres.search import SearchVector
from .forms import EmailPostForm, CommentForm, SearchForm

def post_list(request):
  posts = Post.published.all() 
  paginator = Paginator(posts, 3)
  page = request.GET.get('page')
  try:
    posts = paginator.page(page)
  except PageNotAnInteger:
    posts = paginator.page(1) 
  except EmptyPage: 
    posts = paginator.page(paginator.num_pages)

  return render(request, 
                'blog/post/list.html', 
                {'posts': posts,
                'page': page })

def post_detail(request, year, month, day, post):
  post = get_object_or_404(Post, slug=post, status='published',
                          publish__year=year,
                          publish__month=month, 
                          publish__day=day)
  comments = post.comments.filter(active=True)
  post_tags_ids = post.tags.values_list('id', flat=True)
  similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id) 
  similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:4] 
  new_comment = None
  if request.method == 'POST':
      comment_form = CommentForm(data=request.POST)
      if comment_form.is_valid(): 
            new_comment = comment_form.save(commit=False) 
            new_comment.post = post 
            new_comment.save() 
  else: 
      comment_form = CommentForm()
  return render(request, 
                'blog/post/detail.html', 
                {'post': post, 
                'comments': comments, 
                'new_comment': new_comment, 
                'comment_form': comment_form,
                'similar_posts': similar_posts})

def post_share(request, post_id): 
  post = get_object_or_404(Post, id=post_id, status='published') 
  sent = False 
  if request.method == 'POST': 
      form = EmailPostForm(request.POST) 
      if form.is_valid():
          cd = form.cleaned_data  
          post_url = request.build_absolute_uri(post.get_absolute_url()) 
          subject = f"{cd['name']} recommends you read " f"{post.title}"  
          message = f"Read {post.title} at {post_url}\n\n" f"{cd['name']}\'s comments: {cd['comments']}" 
          send_mail(subject, message, 'yzr749@qq.com', 
                      [cd['to']]) 
          sent = True 
  else: 
      form = EmailPostForm()
  return render(request, 'blog/post/share.html', {'post': post,
                                                  'form': form, 
                                                  'sent': sent})

def post_search(request): 
  form = SearchForm() 
  query = None 
  results = [] 
  if 'query' in request.GET:  
    form = SearchForm(request.GET)  
    if form.is_valid(): 
      query = form.cleaned_data['query']  
      results = Post.published.annotate( 
        search=SearchVector('title', 'body') 
        ).filter(search=query) 
  return render(request,  
                'blog/post/search.html', { 
                'form': form, 
                'query': query, 
                'results': results 
              }) 
